home *** CD-ROM | disk | FTP | other *** search
- NAME PDISKIO
- PAGE 60,132
- ;****************************************************************;
- ; ;
- ; PHYSICAL DISK I/O ;
- ; ;
- ;****************************************************************;
-
- _TEXT SEGMENT BYTE PUBLIC 'CODE'
- _TEXT ENDS
- CONST SEGMENT WORD PUBLIC 'CONST'
- CONST ENDS
- _BSS SEGMENT WORD PUBLIC 'BSS'
- _BSS ENDS
- _DATA SEGMENT WORD PUBLIC 'DATA'
- _DATA ENDS
- DGROUP GROUP CONST, _BSS, _DATA
- ASSUME CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
-
- _TEXT SEGMENT
-
- ;****************************************************************;
- ; ;
- ; char ;
- ; disk_io(cmd, drive, buf, count, sector, head, cylinder) ;
- ; 4 6 8 10 12 14 16 ;
- ;****************************************************************;
-
- PUBLIC _DISK_IO
- _DISK_IO PROC NEAR
-
- PUSH BP ; SAVE FRAME
- MOV BP, SP ; MAKE NEW FRAME
- PUSH ES ;
- PUSH SI ;
- PUSH DI ;
- MOV AH, [BP+4] ; PICK UP COMMAND
- MOV DL, [BP+6] ; PICK UP DRIVE
- MOV BX, [BP+8] ; PICK UP BUFFER
- PUSH DS ;
- POP ES ;
- MOV AL, [BP+10] ; PICK UP COUNT
- MOV DH, [BP+14] ; PICK UP HEAD
- MOV CH, [BP+17] ; HIGH CYL BITS
- SHR CX, 1 ; SHF 2 MSB TO CL
- SHR CX, 1 ;
- AND CL, 0C0H ; MASK THEM
- ADD CL, [BP+12] ; ADD IN SECTOR
- INC CL ; PLUS ONE
- MOV CH, [BP+16] ; REST CYL IN CH
- INT 13H ; CALL BIOS
- JC SAVERR ; JUMP IF ERROR
- MOV AH, 0 ; CLEAR RESULT
- CMP BYTE PTR [BP+4], 8 ; DRIVE PARAM CMD
- JNE SAVERR ; JUMP IF NOT
- MOV BX, [BP+8] ; RESULTS IN BUF
- MOV [BX], CL ; SECTORS
- AND BYTE PTR [BX], 03FH ;
- MOV BYTE PTR [BX+1], 0 ;
- INC DH ;
- MOV [BX+2], DH ; HEADS
- MOV BYTE PTR [BX+3], 0 ;
- MOV [BX+4], CH ; CYLINDERS
- SHL CX, 1 ; FIX HIGH BYTE
- SHL CX, 1 ;
- AND CH, 003H ;
- MOV [BX+5], CH ;
- MOV [BX+6], DL ; DRIVES
- MOV BYTE PTR [BX+7], 0 ;
- SAVERR: MOV AL, AH ; RESULT IN AX
- MOV AH, 0 ;
- POP DI ; RESTORE REGS
- POP SI ;
- POP ES ;
- POP BP ; RESTORE FRAME
- RET ; RETURN
-
- _DISK_IO ENDP
-
- ;****************************************************************;
- ; ;
- ; Get the current BIOS clock tick count ;
- ; ;
- ; long ticks(); ;
- ; ;
- ;****************************************************************;
-
- PUBLIC _TICK
- _TICK PROC NEAR
-
- PUSH BP ; SAVE FRAME
- MOV BP, SP ; MAKE NEW FRAME
- PUSH ES ;
- MOV AX, 0 ; CLEAR ES TO
- MOV ES, AX ; GET BIOS DATA
- CLI ; DISABLE INTS
- MOV AX, ES:WORD PTR [046CH] ; LOW TICK COUNT
- MOV DX, ES:WORD PTR [046EH] ; HIGH TICK COUNT
- STI ; ENABLE INTS
- POP ES ; RESTORE REGS
- POP BP ; RESTORE FRAME
- RET ; RETURN
-
- _TICK ENDP
-
- ;****************************************************************;
-
- _TEXT ENDS
-
- END